package br.academia.arq.dao;

import java.util.Collection;
import java.util.HashMap;

import org.hibernate.HibernateException;
import org.hibernate.Query;

import br.academia.arq.erros.DAOException;
import br.academia.dominio.Usuario;
import br.academia.util.Validador;


/**
 * Dao com operações referentes a Usuario
 * @see Usuario
 */
public class UsuarioDAO extends GenericDAO{
	
	/**
	 * Método que retorna um Usuario que possua o
	 * login e a senha idênticos aos passados como parâmetros
	 * @param nome
	 * @return
	 * @throws HibernateException
	 * @throws DAOException
	 */
	public Usuario findUsuarioByLoginSenha(String login, String senha) throws HibernateException, DAOException{
		String hql = "select u from Usuario u where u.login = :login and u.senha = :senha ";
		
		Query q = getSession().createQuery(hql);
		
		q.setParameter("login", login);
		q.setParameter("senha", senha);
		
		Usuario usuario = (Usuario) q.uniqueResult();
		
		return usuario;
	}
	
	/**
	 * Método que retorna um Usuario que possua o
	 * nome idêntico ao passado como parâmetro
	 * @param nome
	 * @return
	 * @throws HibernateException
	 * @throws DAOException
	 */
	public Usuario findUsuarioByLogin(String login) throws HibernateException, DAOException{
		String hql = "select u from Usuario u where u.login = :login ";
		
		Query q = getSession().createQuery(hql);
		
		q.setParameter("login", login);
		
		Usuario usuario = (Usuario) q.uniqueResult();
		
		return usuario;
	}
	
	/**
	 * Método que retorna usuarios que tenham parametros parecidos
	 * com os itens do usuario passado como parâmetro
	 * @param usuario
	 * @return
	 * @throws HibernateException
	 * @throws DAOException
	 */
	public Collection<Usuario> findUsuarioLike(Usuario usuario) throws HibernateException, DAOException{
		String hql = "select u from Usuario u where 1 = 1 ";
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		
		if(!Validador.isEmpty(usuario.getLogin())){
			hql += " and u.login like :login ";
			parametros.put("login", "%" + usuario.getLogin() + "%");
		}
		
		if(!Validador.isEmpty(usuario.getSenha())){
			hql += " and u.senha like :senha ";
			parametros.put("senha", "%" + usuario.getSenha() + "%");
		}
		
		Query q = getSession().createQuery(hql);
		
		setParametros(parametros, q);
		
		@SuppressWarnings("unchecked")
		Collection<Usuario> usuarios = q.list();
		
		return usuarios;
	}
}
